#include "wlumiere.h"

/*****************************************************
 * Constructeur
 * @param parent : parent de cet objet
 *****************************************************/
WLumiere::WLumiere(QWidget *parent)
    :QTableWidget(0,10, parent)
{
    initialiser();

    connect(this, SIGNAL(cellChanged(int,int)), this, SLOT(celluleChanged(int, int)));
    connect(this, SIGNAL(cellClicked(int,int)), this, SLOT(celluleClick(int, int)));
}

/*****************************************************
 * Fonction permettant de réinitialiser le tableau
 * de la lumière
 *****************************************************/
void WLumiere::initialiser()
{
    //on supprime toutes les lignes
    while(this->rowCount() != 0)
    {
        this->removeRow(0);
    }

    _gestionnaireLumieres = &GestionnaireLumieres::getInstance();
    this->clear();

    //tableWidget.setItemDelegate(new StarDelegate);
    this->setEditTriggers(QAbstractItemView::DoubleClicked
                                | QAbstractItemView::SelectedClicked);
    this->setSelectionBehavior(QAbstractItemView::SelectRows);

    //Ajout de l'entete
    QStringList enteteTable;
    enteteTable << "Active" << "Numero" << "Couleur ambiante" << "Couleur speculaire" << "Couleur diffuse"
                << "Couleur de reflexion" << "Pos_X" << "Pos_Y" << "Pos_Z" << "Pos_W";
    this->setHorizontalHeaderLabels(enteteTable);


    //Création des items du tableau
    for(int i = 0; i < 8; ++i)
    {
        QTableWidgetItem *item0 = new QTableWidgetItem; //Active
        QTableWidgetItem *item1 = new QTableWidgetItem("LIGHT_" + QString::number(i));
        QTableWidgetItem *item2 = new QTableWidgetItem; //Couleur ambiante
        QTableWidgetItem *item3 = new QTableWidgetItem; //Couleur speculaire
        QTableWidgetItem *item4 = new QTableWidgetItem; //Couleur diffuse
        QTableWidgetItem *item5 = new QTableWidgetItem; //Couleur de réflxion
        QTableWidgetItem *item6 = new QTableWidgetItem; //Pos_X
        QTableWidgetItem *item7 = new QTableWidgetItem; //Pos_Y
        QTableWidgetItem *item8 = new QTableWidgetItem; //Pos_Z
        QTableWidgetItem *item9 = new QTableWidgetItem; //Pos_W

        item0->setData(0, _gestionnaireLumieres->getLumiere(i).estActif());
        item2->setBackgroundColor(_gestionnaireLumieres->getLumiere(i).getCouleurAmbiante());
        item3->setBackgroundColor(_gestionnaireLumieres->getLumiere(i).getCouleurSpeculaire());
        item4->setBackgroundColor(_gestionnaireLumieres->getLumiere(i).getCouleurDiffuse());
        item5->setBackgroundColor(_gestionnaireLumieres->getLumiere(i).getCouleurReflexionSpeculaire());
        item6->setData(0, _gestionnaireLumieres->getLumiere(i).getPosX());
        item7->setData(0, _gestionnaireLumieres->getLumiere(i).getPosY());
        item8->setData(0, _gestionnaireLumieres->getLumiere(i).getPosZ());
        item9->setData(0, _gestionnaireLumieres->getLumiere(i).getPosW());


        this->insertRow(i);
        this->setItem(i, 0, item0);
        this->setItem(i, 1, item1);
        this->setItem(i, 2, item2);
        this->setItem(i, 3, item3);
        this->setItem(i, 4, item4);
        this->setItem(i, 5, item5);
        this->setItem(i, 6, item6);
        this->setItem(i, 7, item7);
        this->setItem(i, 8, item8);
        this->setItem(i, 9, item9);

        item1->setFlags(item1->flags() & ~Qt::ItemIsSelectable);
        item1->setFlags(item1->flags() & ~Qt::ItemIsEditable);

        item2->setFlags(item2->flags() & ~Qt::ItemIsSelectable);
        item2->setFlags(item2->flags() & ~Qt::ItemIsEditable);

        item3->setFlags(item3->flags() & ~Qt::ItemIsSelectable);
        item3->setFlags(item3->flags() & ~Qt::ItemIsEditable);

        item4->setFlags(item4->flags() & ~Qt::ItemIsSelectable);
        item4->setFlags(item4->flags() & ~Qt::ItemIsEditable);

        item5->setFlags(item5->flags() & ~Qt::ItemIsSelectable);
        item5->setFlags(item5->flags() & ~Qt::ItemIsEditable);
    }

    this->resizeColumnsToContents();
    this->adjustSize();

}


/*****************************************************
 *  Slot appelé lors du click sur une cellule
 * @param row : ligne de la cellule clickée
 * @param column : colonne de la cellule clickée
 *****************************************************/
void WLumiere::celluleClick(int row, int column)
{
    //On clique sur une cellule de couleur
    if(column == 2 || column == 3 || column == 4 || column == 5)
    {
        float r, g, b, a;
        bool *diagResult;
        QColorDialog diag;
        diag.setOption(QColorDialog::ShowAlphaChannel, true);

        QColor couleur = diag.getRgba(QRgb(), diagResult , this);

        //Si on accepte la nouvelle couleur
        if(diagResult)
        {
            r = couleur.redF();
            g = couleur.greenF();
            b = couleur.blueF();
            a = couleur.alphaF();

            if(column == 2)
            {
                _gestionnaireLumieres->getLumiere(row).setCouleurAmbiante(r, g, b, a);
            }else if (column == 3)
            {
                _gestionnaireLumieres->getLumiere(row).setCouleurSpeculaire(r, g, b, a);
            }else if (column == 4)
            {
                _gestionnaireLumieres->getLumiere(row).setCouleurDiffuse(r, g, b, a);
            }else if (column == 5)
            {
                _gestionnaireLumieres->getLumiere(row).setCouleurReflectionSpeculaire(r, g, b, a);
            }

            //on met à jour la couleur de fond
            this->item(row, column)->setBackgroundColor(couleur);
            this->update();
        }

    }
}


/*****************************************************
 *  Slot appelé lors du changement de valeur sur une cellule
 * @param row : ligne de la cellule clickée
 * @param column : colonne de la cellule clickée
 *****************************************************/
void WLumiere::celluleChanged(int row, int column)
{
    //Active
    if(column == 0)
    {
        if(this->item(row, column)->data(0).toBool())
            GestionnaireLumieres::getInstance().getLumiere(row).enable();
        else
            GestionnaireLumieres::getInstance().getLumiere(row).disable();
    }
    //pos_x
    else if(column == 6)
    {
        GestionnaireLumieres::getInstance().getLumiere(row).setPosX(this->item(row, column)->data(0).toFloat());
    }
    //pos_y
    else if(column == 7)
    {
        GestionnaireLumieres::getInstance().getLumiere(row).setPosY(this->item(row, column)->data(0).toFloat());
    }
    //pos_z
    else if(column == 8)
    {
        GestionnaireLumieres::getInstance().getLumiere(row).setPosZ(this->item(row, column)->data(0).toFloat());
    }
    //pos_w
    else if(column == 9)
    {
        GestionnaireLumieres::getInstance().getLumiere(row).setPosW(this->item(row, column)->data(0).toFloat());
    }
}
